Technical Q&A QA1129
Workaround for Asynchronous SCSIAction Crashes


Q: Mac OS X 10.1.x Ç≈ÅAîÒìØä˙Çà SCSIAction ÇåƒÇ—èoǪǧÇΔÇ∑ÇÈÇΔÅAéÑÇà CFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉNÉâÉbÉVÉÖÇ∑ÇÈÇÃÇÕÇ»Ç∫Ç≈ǵÇÂǧǩÅH

A: džÇÈÉoÉOÅir. 2649048ÅjÇ™å¥àˆÇ≈ìKêÿÇ» Mach-O to CFM ÉOÉãÅ[Ç™çÏê¨Ç≥ÇÍǃǻǢÇΩÇflÇ…ÅASCSIAction Ç™ÉAÉvÉäÉPÅ[ÉVÉáÉìÇà CFM ÉRÅ[ÉãÉoÉbÉNä÷êîÇåƒÇ—èoǪǧÇΔǵÇΩÇΔÇ´Ç…ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉNÉâÉbÉVÉÖǵNjǢNjÇ∑ÅBDZÇÃñ‚ëËÇâÒîÇ∑ÇÈÇ…ÇÕÅANewSCSICallbackUPP ÇΔ DisposeSCSICallbackUPP ÇåƒÇ—èoÇ∑ë„ÇÌÇËÇ…à»â∫Ç…é¶Ç∑ÉRÅ[ÉhÇé¿ëïÇ∑ÇÈÇæÇØÇ≈Ç∑ǛNjÇ∑ÅB ç™ñ{ÇÃÉoÉOÇ™èCê≥Ç≥ÇÍÇΩÇΔǴDžDZÇÃâÒîÉRÅ[ÉhÇçÌèúÇ≈Ç´ÇÈÇÊǧDžÅAÉVÉXÉeÉÄÇÃÉAÉbÉvÉfÅ[ÉgÇ‚ OS ÇÃÉÅÉWÉÉÅ[ÉäÉäÅ[ÉXÇΔìØéûÇ…åˆäJÇ≥ÇÍÇÈÉeÉNÉjÉJÉãÉmÅ[ÉgÇämîFÇ∑ÇÈÇÃÇñYÇÍǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅB



SCSICallbackUPP
MyNewSCSICallbackUPP(SCSICallbackProcPtr cfmfp)
{

#if TARGET_RT_MAC_CFM


    long systemVersion = 0;


    if (Gestalt(gestaltSystemVersion, &systemVersion) == noErr && systemVersion >= 0x1010)
    {
        UInt32 temp[6] = {0x3D800000, 0x618C0000, 0x800C0000,
                          0x804C0004, 0x7C0903A6, 0x4E800420};

        // äÑÇËìñǃÉÅÉÇÉäÇÕå„Ç≈îjä¸Ç∑ÇÈïKóvǙdžÇÈ
        UInt32 * mfp = (UInt32*) NewPtr(sizeof(temp));
        mfp[0] = temp[0] | ((UInt32)cfmfp >> 16);
        mfp[1] = temp[1] | ((UInt32)cfmfp & 0xFFFF);
        mfp[2] = temp[2];
        mfp[3] = temp[3];
        mfp[4] = temp[4];
        mfp[5] = temp[5];

        MakeDataExecutable(mfp, sizeof(temp));

        return ((SCSICallbackUPP)mfp);
    }
    else
    {
        return (NewSCSICallbackUPP(cfmfp));
    }

#else

    return (NewSCSICallbackUPP(cfmfp));

#endif

}



void
MyDisposeSCSICallbackUPP(SCSICallbackUPP fp)
{

#if TARGET_RT_MAC_CFM

    long systemVersion = 0;

    if (Gestalt(gestaltSystemVersion, &systemVersion) == noErr && systemVersion >= 0x1010)
    {
        DisposePtr((char *)fp);
    }
    else
    {
        DisposeSCSICallbackUPP(fp);
    }

#else

    DisposeSCSICallbackUPP(fp);

#endif

}

ÉäÉXÉg 1 Mach-O to CFM ÉOÉãÅ[ÇçÏê¨Ç∑ÇÈÉRÅ[Éh




[2002 îN 3 åé 18 ì˙]